package org.hang.gift.service.impl;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import org.hang.exception.BusinessException;
import org.hang.exception.ResponseCode;
import org.hang.exception.RonghuaAssert;
import org.hang.gift.constants.UserConstants;
import org.hang.gift.domain.User;
import org.hang.gift.service.IUserService;
import org.hang.gift.service.IVerifyCodeService;
import org.hang.util.VerifyCodeUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

@Service
public class VerifyCodeServiceImpl implements IVerifyCodeService {

    @Autowired
    private IUserService userService;

    @Autowired
    private RedisTemplate<Object,Object> redisTemplate;

    @Override
    public void userRegisterSendSms(String phone) {
        //1.验证手机号是否已经注册过 --前端的验证不可靠
        User user =  userService.selectOne(new EntityWrapper<User>().eq("phone",phone));
        RonghuaAssert.isNull(user, ResponseCode.RESPONSE_CODE_400009);

        //2.如果没有注册过，给用户的手机号发送短信
        //4.1 生成一个验证码 第一个参数为验证码的位数，第二个参为数据源
        String code = VerifyCodeUtils.generateVerifyCode(6, "0123456789");
        //首先判断redis中是否有这个手机号的验证码，并且是否过期
        String key = UserConstants.USER_REGISTER_SEND_SMS_KEY+"-"+phone;
        Object codeInRedis = redisTemplate.opsForValue().get(key);
        if(codeInRedis!=null){ //证明当前的手机号已经发过验证码 ,还没有过期
             String codeInRedisStr = codeInRedis.toString();
            // 第二次发送相同的验证码
             code = codeInRedisStr.split(":")[0];
            //使用当前的时间-上一次发送验证码的时间，如果小于60s 就是不合法的请求--报错
            Long preTime = Long.valueOf(codeInRedis.toString().split(":")[1]);
            if(System.currentTimeMillis()-preTime<1000*60){
                throw new BusinessException(ResponseCode.RESPONSE_CODE_400012);
            }

        }

        //4.2 发送到用户的手机
        //SendSmsUtils.sendMsg(phone,code);
        System.out.println("手机验证码为:"+code);
        //5.把手机号存储起来--后续在提交数据,保存用户的时候 验证
        /*
            把验证码和当前时间存储在redis里面
             key:  固定前缀:phone          value:   code:date
         */
        redisTemplate.opsForValue().set(key,code+":"+System.currentTimeMillis(),5, TimeUnit.MINUTES);
    }
}
